/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package proyecto1;

import java.util.Calendar;
import java.util.Observable;
import java.util.Observer;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

/**
 *
 * @author grupo
 */
public class Gestor implements java.awt.event.ActionListener,
        ListSelectionListener, Observer {

    private RegistroDeEmpresa modelo;
    private InterfazUsuario vista;

    /**
     *
     */
    public Gestor() {

    }

    /**
     *
     * @param e
     */
    @Override
    public void actionPerformed(java.awt.event.ActionEvent e) {
        String comando = e.getActionCommand();

        Plan plan = null;

        switch (comando) {
            case "CREAR_PLAN":
                //if (Plan.getCantPlanes() == 0) {
                vista.habilitarValoresPlan(true);
                //}

                Plan unPlan = new Plan(vista.getTFOriginador());

                unPlan.setTipoDePlan(vista.obtenerTipoPlan());
                unPlan.setDescripcionDelPlan(vista.obtenerDescripcionPlan());
                asignarPlanASucursal(unPlan);

                String fila[] = new String[]{
                    unPlan.getCodigo(),
                    unPlan.getNombreDeSucursal(),
                    unPlan.getTipoDePlan().toString(),
                    unPlan.getDescripcionDelPlan(),
                    unPlan.getOriginador(),
                    "",
                    "",
                    "",
                    formatoFecha(unPlan.getFechaDeRegistro()),
                    "",
                    "",
                    "",
                    unPlan.getIndiceEficiencia() + ""
                };

                vista.agregarLineaTabla(fila);
                modelo.registrarPlan(unPlan.getCodigo(), unPlan);
                vista.setPlanSeleccionadoEnTabla(Plan.getCantPlanes() - 1);

                unPlan.addObserver(this);
                actualizarEstadisticas();

                break;

            case "ASIGNAR_SUCURSAL":
                if (Plan.getCantPlanes() > 0) {
                    plan = modelo.obtenerPlan(vista.getPlanSeleccionadoDeTabla());
                    asignarPlanASucursal(plan);
                    vista.actualizarTablaPlanes(1, plan.getNombreDeSucursal());
                }
                break;

            case "ASIGNAR_ADMIN":
                plan = modelo.obtenerPlan(vista.getPlanSeleccionadoDeTabla());
                if (plan.setAdministrator(vista.getTFAdministrador())) {
                    vista.habilitarLider(true);
                    vista.actualizarTablaPlanes(5, plan.getAdministrator());
                }

                break;

            case "ASIGNAR_LIDER":
                plan = modelo.obtenerPlan(vista.getPlanSeleccionadoDeTabla());
                if (plan.setLider(vista.getTFLider())) {
                    vista.habilitarValoresActividad(true);
                    vista.habilitarAuditor(true);
                    vista.actualizarTablaPlanes(6, plan.getLider());
                    vista.actualizarTablaPlanes(9, formatoFecha(plan.getFechaDeAsignacion()));
                }

                break;

            case "ASIGNAR_AUDITOR":
                plan = modelo.obtenerPlan(vista.getPlanSeleccionadoDeTabla());
                if (plan.setAuditor(vista.getTFAuditor())) {
                    vista.habilitarMarcarPlanResuelto(true);
                    vista.actualizarTablaPlanes(7, plan.getAuditor());
                }

                break;

            case "SET_CORRECTIVO":
                plan = modelo.obtenerPlan(vista.getPlanSeleccionadoDeTabla());
                plan.setTipoDePlan(TipoDePlan.CORRECTIVO);
                vista.actualizarTablaPlanes(2, plan.getTipoDePlan().toString());
                break;

            case "SET_PREVENTIVO":
                plan = modelo.obtenerPlan(vista.getPlanSeleccionadoDeTabla());
                plan.setTipoDePlan(TipoDePlan.PREVENTIVO);
                vista.actualizarTablaPlanes(2, plan.getTipoDePlan().toString());
                break;

            case "AGREGAR_ACTIVIDAD":
                plan = modelo.obtenerPlan(vista.getPlanSeleccionadoDeTabla());

                if (vista.obtenerDescripcionActvidad().isEmpty()) {
                    Actividad unaActvidad = new Actividad("n/a",
                            vista.getFechaPropuestaActividad());

                    String fila2[] = new String[]{
                        unaActvidad.getDescripcion(),
                        formatoFecha(unaActvidad.getFechaPropuestaConclusion()),
                        ""
                    };

                    plan.addActividad(unaActvidad);
                    vista.agregarLineaTabla2(fila2);
                    vista.setActividadSeleccionadoEnTabla(plan.getCantidadActividades() - 1);
                    vista.habilitarCerrarActividad(true);
                    break;
                } else {
                    Actividad unaActvidad = new Actividad(vista.obtenerDescripcionActvidad(),
                            vista.getFechaPropuestaActividad());
                    String fila2[] = new String[]{
                        unaActvidad.getDescripcion(),
                        formatoFecha(unaActvidad.getFechaPropuestaConclusion()),
                        ""};
                    plan = modelo.obtenerPlan(vista.getPlanSeleccionadoDeTabla());
                    plan.addActividad(unaActvidad);
                    vista.agregarLineaTabla2(fila2);

                    vista.setActividadSeleccionadoEnTabla(plan.getCantidadActividades() - 1);
                    vista.habilitarCerrarActividad(true);
                    break;

                }

            case "CERRAR_ACTIVIDAD":
                plan = modelo.obtenerPlan(vista.getPlanSeleccionadoDeTabla());
                Actividad activa = plan.getActividad(vista.getActividadSeleccionadaDeTabla());
                activa.setFechaRealConclusion(Calendar.getInstance());
                vista.actualizarTablaActividades(2, formatoFecha(activa.getFechaRealConclusion()));
                break;

            case "MARCAR_PLAN_RESUELTO":
                plan = modelo.obtenerPlan(vista.getPlanSeleccionadoDeTabla());
                if (vista.isPlanMarcadoResuelto()) {
                    if (plan.setFechaRealizacionAnalisis(Calendar.getInstance())) {
                        vista.habilitarValoresAuditoria(vista.isPlanMarcadoResuelto());
                        vista.actualizarTablaPlanes(10, formatoFecha(plan.getFechaRealizacionAnalisis()));
                        vista.actualizarTablaPlanes(12, plan.getIndiceEficiencia() + "");
                    } else {
                        vista.setPlanMarcadoResuelto(false);
                    }
                } else {
                    //plan.setFechaRealizacionAnalisis(Calendar.getInstance());
                    vista.actualizarTablaPlanes(10, "");
                }
                break;

            case "CERRAR_AUDITORIA":
                plan = modelo.obtenerPlan(vista.getPlanSeleccionadoDeTabla());
                String descripcionAudotoria = vista.getResolucionAuditoria();
                boolean efectivo = vista.getResolucionAuditor();

                if (plan.setResolucionDelAuditor(descripcionAudotoria)) {
                    plan.setPlanEfectivo(efectivo);

                    vista.actualizarTablaPlanes(11, descripcionAudotoria);
                    vista.actualizarEstadoDePlan(plan.isPlanEfectivo() ? "Efectivo" : "Inefectivo");

                    vista.habilitarEdicionPlan(false);
                }
                if (!plan.isPlanEfectivo()) {
                    vista.habilitarEdicionPlan(false);
                    vista.actualizarEstadoDePlan("Inefectivo");
                }

                break;
        }
    } //actionPerformed()

    /**
     *
     * @param evt
     */
    @Override
    public void valueChanged(ListSelectionEvent evt) {
        Plan elPlan = modelo.obtenerPlan(vista.getPlanSeleccionadoDeTabla());
        if (evt.getSource() == vista.getJtActividades().getSelectionModel()) {
            refrescarCamposActividades(elPlan);
        } else {
            if (elPlan.isPlanCerrado()) {
                vista.habilitarEdicionPlan(false);
            } else {
                vista.setTFOriginador(elPlan.getOriginador());
                vista.setTFAdministrador(elPlan.getAdministrator());
                vista.setTFLider(elPlan.getLider());
                vista.setTFAuditor(elPlan.getAuditor());
                vista.setRBTipoPlan(elPlan.getTipoDePlan());
                vista.setTFSucursal(elPlan.getNombreDeSucursal());
                vista.limpiarTablaActvidades();
                refrescarTablaActividades(elPlan);
                refrescarCamposActividades(elPlan);
                vista.actualizarEstadoDePlan(elPlan.isPlanEfectivo() ? "Efectivo" : "Inefectivo");

                if (elPlan.getAdministrator().isEmpty()) {
                    vista.habilitarLider(false);
                } else {
                    vista.habilitarLider(true);
                }

                if (elPlan.getLider().isEmpty()) {
                    vista.habilitarAuditor(false);
                } else {
                    vista.habilitarAuditor(true);
                }

                if (elPlan.getAuditor().isEmpty()) {
                    vista.habilitarValoresAuditoria(false);
                } else {
                    vista.habilitarValoresAuditoria(true);
                }
                
                if(elPlan.isPlanCerrado())
                {
                    vista.setTBCerrarPlanMarcado(true);
                }else{
                    vista.setTBCerrarPlanMarcado(false);
                }
            }
        }
    }

    private String formatoFecha(Calendar pcal) {
        return pcal.get(Calendar.DATE) + "-" + (pcal.get(Calendar.MONTH) + 1) + "-" + pcal.get(Calendar.YEAR);
    }

    /**
     * @return the modelo
     */
    public RegistroDeEmpresa getModelo() {
        return modelo;
    }

    /**
     * @param pmodelo
     */
    public void setModelo(RegistroDeEmpresa pmodelo) {
        this.modelo = pmodelo;
    }

    /**
     * @return the vista
     */
    public InterfazUsuario getVista() {
        return vista;
    }

    /**
     * @param pVista
     */
    public void setVista(InterfazUsuario pVista) {
        this.vista = pVista;
    }

    // public void iniciarModelo() {
    // }
    /**
     *
     */
    public void iniciarVista() {
        String usuarios[] = {"Antonio Luna", "Barack Obama", "Luis Guillermo Solís", "Lady Gaga", "Javier González",
            "Eduardo Pineda", "Oldemarsh de Tierra Blanca", "Maikol Yordan Soto", "El Porcionzón"};

        for (String usuario : usuarios) {
            vista.addCBItemAdministrador(usuario);
            vista.addCBItemOriginador(usuario);
            vista.addCBItemLider(usuario);
            vista.addCBItemAuditor(usuario);
        }

        for (Sucursal sucursal : modelo.getListaSucursales()) {
            vista.addCBItemSucursal(sucursal.getId());
            sucursal.addObserver(this);
        }
    }

    /**
     *
     * @param obs
     * @param obj
     */
    @Override
    public void update(Observable obs, Object obj) {
        String mensaje = (String) obj;
        vista.setTFEstado(mensaje);
        actualizarEstadisticas();
    } //update()

    
    
    private void actualizarEstadisticas() {
        vista.setTFCantidadPlanesRegistrados(Plan.getCantPlanes() + "");
        vista.setTFIndicadorEficaciaGlobal(modelo.getIndiceEficaciaGlobal() + "");
        vista.setTFIndicePrevisionGlobal(modelo.getIndicePrevisionGlobal());
        vista.setTFCantidadPlanesEfectivos(modelo.getCantPlanesEfectivos() + "");
        vista.setTFCantidadPlanesInefectivos(modelo.getCantPlanesInfectivos() + "");
        vista.setTFIndicadorEficienciaGlobal(modelo.getIndicadorEficiencia() + "");
        vista.setTFSucursalMayorPrevision(modelo.getSucursalMayorIndicePrevision());
        vista.setTFSucursalMayorPlanesCorrectivos(modelo.getSucursalMayorCorrectivos());
        vista.setTFSucursalMayorPlanesPreventivos(modelo.getSucursalMayorPreventivos());

        vista.setTFPlanesRegistradosSucursal1(modelo.getSucursal(0).getCantPlanes() + "");
        vista.setTFPlanesCorrectivosSuc1(modelo.getSucursal(0).getPlanesCorrectivos() + "");
        vista.setTFPlanesPreventivosSuc1(modelo.getSucursal(0).getPlanesPreventivos() + "");
        vista.setTFIndicadorEficaciaSuc1(modelo.getSucursal(0).getIndicadorEficacia() + "");
        vista.setTFIndicadorEficienciaSuc1(modelo.getSucursal(0).getIndiceEficiencia() + "");
        vista.setTFIndicePrevisionSuc1(modelo.getSucursal(0).getIndicePrevisionString());

        vista.setTFPlanesRegistradosSucursal2(modelo.getSucursal(1).getCantPlanes() + "");
        vista.setTFPlanesCorrectivosSuc2(modelo.getSucursal(1).getPlanesCorrectivos() + "");
        vista.setTFPlanesPreventivosSuc2(modelo.getSucursal(1).getPlanesPreventivos() + "");
        vista.setTFIndicadorEficaciaSuc2(modelo.getSucursal(1).getIndicadorEficacia() + "");
        vista.setTFIndicadorEficienciaSuc2(modelo.getSucursal(1).getIndiceEficiencia() + "");
        vista.setTFIndicePrevisionSuc2(modelo.getSucursal(1).getIndicePrevisionString());

        vista.setTFPlanesRegistradosSucursal3(modelo.getSucursal(2).getCantPlanes() + "");
        vista.setTFPlanesCorrectivosSuc3(modelo.getSucursal(2).getPlanesCorrectivos() + "");
        vista.setTFPlanesPreventivosSuc3(modelo.getSucursal(2).getPlanesPreventivos() + "");
        vista.setTFIndicadorEficaciaSuc3(modelo.getSucursal(2).getIndicadorEficacia() + "");
        vista.setTFIndicadorEficienciaSuc3(modelo.getSucursal(2).getIndiceEficiencia() + "");
        vista.setTFIndicePrevisionSuc3(modelo.getSucursal(2).getIndicePrevisionString());

        vista.setTFPlanesRegistradosSucursal4(modelo.getSucursal(3).getCantPlanes() + "");
        vista.setTFPlanesCorrectivosSuc4(modelo.getSucursal(3).getPlanesCorrectivos() + "");
        vista.setTFPlanesPreventivosSuc4(modelo.getSucursal(3).getPlanesPreventivos() + "");
        vista.setTFIndicadorEficaciaSuc4(modelo.getSucursal(3).getIndicadorEficacia() + "");
        vista.setTFIndicadorEficienciaSuc4(modelo.getSucursal(3).getIndiceEficiencia() + "");
        vista.setTFIndicePrevisionSuc4(modelo.getSucursal(3).getIndicePrevisionString());

    }

    /**
     *
     * @param pplan
     */
    public void asignarPlanASucursal(Plan pplan) {
        for (Sucursal suc : modelo.getListaSucursales()) {
            if (suc.tienePlanRegistrado(pplan.getCodigo())) {
                suc.desregistarPlan(pplan.getCodigo(), pplan);
            }
        }
        pplan.setNombreDeSucursal(vista.obtenerNombreSucursal());
        Sucursal suc = obtenerSucursal(vista.obtenerNombreSucursal());
        modelo.registrarPlanConSucursal(pplan, suc);
    }

    private Sucursal obtenerSucursal(String pnombreSucursal) {
        Sucursal suco = null;

        for (Sucursal suc : modelo.getListaSucursales()) {
            if (suc.getId() == pnombreSucursal) {
                suco = suc;
            }
        }
        return suco;
    }

    /**
     *
     * @param pPlan
     */
    public void refrescarTablaActividades(Plan pPlan) {

        for (Actividad act : pPlan.getListaDeActividades()) {
            String actividadrow[] = new String[]{
                act.getDescripcion(),
                formatoFecha(act.getFechaPropuestaConclusion()),
                ""
            };
            vista.agregarLineaTabla2(actividadrow);
        }
        vista.setActividadSeleccionadoEnTabla(pPlan.getCantidadActividades() - 1);
    }

    /**
     *
     * @param pPlan
     */
    public void refrescarCamposActividades(Plan pPlan) {
        if (!pPlan.getLider().isEmpty()) {
            vista.habilitarValoresActividad(true);
            if (pPlan.tieneActividades() && vista.getJtActividades().getSelectedRow() != -1) {
                vista.setTADescripcionActividad(pPlan.getActividad(vista.getActividadSeleccionadaDeTabla()).getDescripcion());
            }
        } else {
            vista.habilitarValoresActividad(false);
        }
    }
}
